#include <REGX52.H>
#include <INTRINS.H>
#include "Delay.h"
#include "I2C.h"


sbit I2C_SCL = P2^1;
sbit I2C_SDA = P2^0;

/**
  * @brief  I2C延时通过 
  * @param  
  * @retval 
  */
void I2C_Nop(void)
{
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
}

/**
  * @brief  I2C发送起始信号Start
  * @param  无
  * @retval 无
  */
void I2C_Start(void)
{
	I2C_SDA = 1;
	I2C_SCL = 1;	//SCL时钟拉高电平
	I2C_SDA = 0;	//当SCL为高电平时，SDA从高变低表示Start
	I2C_Nop();
	I2C_SCL = 0;
}

/**
  * @brief  I2C发送停止信号Stop
  * @param  无
  * @retval 无
  */
void I2C_Stop(void)
{
	I2C_SDA = 0;	//SDA拉低
	I2C_SCL = 1;	//SCL拉高
	I2C_SDA = 1;	//当SCL为高电平时SDA从低变为高电平表示Stop
}

/**
  * @brief  I2C发送8位数据
  * @param  无
  * @retval 无
  */

void I2C_SendByte(unsigned char byte)
{
	unsigned char i = 0;
	
	for(i=0; i < 8; i++){
		I2C_SDA = byte & (0x80 >> i);
		I2C_Nop();
		I2C_SCL = 1;
		I2C_Nop();
		I2C_SCL = 0;
	}
}

/**
  * @brief  I2C接收8位数据
  * @param  无
  * @retval 接收到的8位数据
  */
unsigned char I2C_RecvByte(void)
{
	unsigned char i = 0;
	unsigned char byte = 0;
		
	byte = 0;
	
	for(i=0; i < 8; i++){
		I2C_SDA = 1;				//释放SDA总线
		I2C_SCL = 1;				//SCL拉高
		if(I2C_SDA){
			byte |= (0x80 >> i);	//读取SDA
		}
		I2C_Nop();
		I2C_SCL = 0;				//SCL拉低
	}
	
	return byte;
}

/**
  * @brief  I2C发送ACK应答信号
  * @param  无
  * @retval 无
  */
void I2C_SendAck(void)
{
	I2C_SDA = 0;
	I2C_SCL = 1;
	I2C_Nop();
	I2C_SCL = 0;
}

/**
  * @brief  I2C发送NACK应答信号
  * @param  无
  * @retval 无
  */
void I2C_SendNack(void)
{
	I2C_SDA = 1;
	I2C_SCL = 1;
	I2C_Nop();
	I2C_SCL = 0;
}

/**
  * @brief  获取I2C ACK应答
  * @param  无
  * @retval 返回值为0或1，0表示ACK，1表示NACK
  */
unsigned char I2C_RecvAck(void)
{
	unsigned char ack = 0;
	
	I2C_SDA = 1;		//释放SDA总线
	I2C_SCL = 1;		//拉高SCL总线
	if(I2C_SDA == 1)	//读取SDA总线
		ack = 1;
	else
		ack = 0;
	
	I2C_Nop();
	I2C_SCL = 0;
	
	return ack;
}


